package br.com.cinesystem.persistence;
import br.com.cinesystem.entity.Endereco;
import br.com.cinesystem.entity.Usuario;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class UsuarioDao extends Dao {

    public UsuarioDao() {
    }

    public Usuario salvar(Usuario u) throws Exception{

        abrirConexao();
        
        SimpleDateFormat formata = new SimpleDateFormat("yyyy/MM/dd");
        String data = formata.format(u.getDataNascimento());

        stmt = con.prepareStatement("insert into usuario values(null,?,?,?,?,?,?,?,md5(?),?,1)");
        stmt.setInt(1, u.getEndereco().getIdEndereco());
        stmt.setString(2, u.getNome());
        stmt.setString(3, u.getSexo());
        stmt.setString(4, data);
        stmt.setString(5, u.getCpf());
        stmt.setString(6, u.getRg());
        stmt.setString(7, u.getEmail());
        stmt.setString(8, u.getSenha());
        stmt.setInt(9, u.getPerfil());

        stmt.execute();

        stmt = con.prepareStatement("select LAST_INSERT_ID() as id");

        rs = stmt.executeQuery();
        
        Usuario usuario = null;

        if(rs.next()){
            usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt("id"));
        }
        fecharConexao();
        return usuario;
    }

    public boolean loginExistente(String login) throws Exception{
        abrirConexao();
        stmt = con.prepareStatement("select * from usuario where email=?");
        stmt.setString(1, login);

        rs = stmt.executeQuery();
        boolean var = rs.next();
        fecharConexao();
        return var;
    }

    public Usuario autenticar(String email, String senha) throws Exception{
        abrirConexao();

        StringBuilder sb = new StringBuilder();
        sb.append("select u.idUsuario, u.id_Endereco, u.nome, u.sexo, u.dataNascimento, ");
        sb.append("u.cpf, u.rg, u.email, u.perfil, u.situacao, ");
        sb.append("e.logradouro, e.numero, e.complemento, e.cep, e.bairro, e.cidade, e.estado ");
        sb.append("from usuario u inner join endereco e ");
        sb.append("on u.id_Endereco = e.idEndereco WHERE email=? and senha=md5(?) and situacao=1");

        stmt = con.prepareStatement(sb.toString());
        stmt.setString(1, email);
        stmt.setString(2, senha);
        rs = stmt.executeQuery();

        Usuario usuario = null;

        if (rs.next()) {
            usuario = new Usuario();

            usuario.setEndereco(new Endereco());

            //SimpleDateFormat sp = new SimpleDateFormat("dd/MM/yyyy");
            //Date data = sp.parse(sp.format(rs.getDate("dataNascimento")));

            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setSexo(rs.getString("sexo"));
            usuario.setDataNascimento(rs.getDate("dataNascimento"));
            usuario.setCpf(rs.getString("cpf"));
            usuario.setRg(rs.getString("rg"));
            usuario.setEmail(rs.getString("email"));
            usuario.setPerfil(rs.getInt("perfil"));
            usuario.setSituacao(rs.getInt("situacao"));
            usuario.getEndereco().setIdEndereco(rs.getInt("id_Endereco"));
            usuario.getEndereco().setLogradouro(rs.getString("logradouro"));
            usuario.getEndereco().setNumero(rs.getString("numero"));
            usuario.getEndereco().setComplemento(rs.getString("complemento"));
            usuario.getEndereco().setCep(rs.getString("cep"));
            usuario.getEndereco().setBairro(rs.getString("bairro"));
            usuario.getEndereco().setCidade(rs.getString("cidade"));
            usuario.getEndereco().setEstado(rs.getString("estado"));

        }
        fecharConexao();
        return  usuario;
    }

    public Usuario buscar(Usuario u)throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();
        sb.append("select u.idUsuario, u.id_Endereco, u.nome, u.sexo, u.dataNascimento, ");
        sb.append("u.cpf, u.rg, u.email, u.perfil, u.situacao, ");
        sb.append("e.logradouro, e.numero, e.complemento, e.cep, e.bairro, e.cidade, e.estado ");
        sb.append("from usuario u inner join endereco e ");
        sb.append("on u.id_Endereco = e.idEndereco WHERE idUsuario=?");

        stmt = con.prepareStatement(sb.toString());
        stmt.setInt(1, u.getIdUsuario());

        rs = stmt.executeQuery();

        Usuario usuario = null;

        if(rs.next()){
            usuario = new Usuario();

            usuario.setEndereco(new Endereco());

            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setSexo(rs.getString("sexo"));
            usuario.setDataNascimento(rs.getDate("dataNascimento"));
            usuario.setCpf(rs.getString("cpf"));
            usuario.setRg(rs.getString("rg"));
            usuario.setEmail(rs.getString("email"));
            usuario.setPerfil(rs.getInt("perfil"));
            usuario.setSituacao(rs.getInt("situacao"));
            usuario.getEndereco().setIdEndereco(rs.getInt("id_Endereco"));
            usuario.getEndereco().setLogradouro(rs.getString("logradouro"));
            usuario.getEndereco().setNumero(rs.getString("numero"));
            usuario.getEndereco().setComplemento(rs.getString("complemento"));
            usuario.getEndereco().setCep(rs.getString("cep"));
            usuario.getEndereco().setBairro(rs.getString("bairro"));
            usuario.getEndereco().setCidade(rs.getString("cidade"));
            usuario.getEndereco().setEstado(rs.getString("estado"));

        }
        fecharConexao();
        return usuario;
    }

    public Usuario alterar(Usuario u) throws Exception{
        abrirConexao();

        SimpleDateFormat formata = new SimpleDateFormat("yyyy/MM/dd");
        String data = formata.format(u.getDataNascimento());

        stmt = con.prepareStatement("UPDATE usuario SET id_Endereco=?, nome=?, sexo=?, "
                + " dataNascimento=?, cpf=?, rg=?, email=?, senha=md5(?), perfil=?, situacao=? WHERE idUsuario=?");

        stmt.setInt(1, u.getEndereco().getIdEndereco());
        stmt.setString(2, u.getNome());
        stmt.setString(3, u.getSexo());
        stmt.setString(4, data);
        stmt.setString(5, u.getCpf());
        stmt.setString(6, u.getRg());
        stmt.setString(7, u.getEmail());
        stmt.setString(8, u.getSenha());
        stmt.setInt(9, u.getPerfil());
        stmt.setInt(10, u.getSituacao());
        stmt.setInt(11, u.getIdUsuario());

        stmt.execute();
        fecharConexao();
        return u;
    }

    public void excluir(Usuario u)throws Exception{

        abrirConexao();

        stmt = con.prepareStatement("UPDATE usuario SET situacao=0 WHERE idUsuario=?");
        stmt.setInt(1, u.getIdUsuario());

        stmt.execute();

        fecharConexao();
        
    }

    public List<Usuario> buscarTodos(int i, int j)throws Exception{
        abrirConexao();

        StringBuilder sb = new StringBuilder();
        sb.append("select u.idUsuario, u.id_Endereco, u.nome, u.sexo, u.dataNascimento, ");
        sb.append("u.cpf, u.rg, u.email, u.perfil, u.situacao, ");
        sb.append("e.logradouro, e.numero, e.complemento, e.cep, e.bairro, e.cidade, e.estado ");
        sb.append("from usuario u inner join endereco e ");
        sb.append("on u.id_Endereco = e.idEndereco WHERE (perfil=? or perfil=?) and situacao=1");

        stmt = con.prepareStatement(sb.toString());
        stmt.setInt(1, i);
        stmt.setInt(2, j);

        rs = stmt.executeQuery();

        Usuario usuario = null;
        List<Usuario> list = new ArrayList<Usuario>();

        while(rs.next()){

            usuario = new Usuario();

            usuario.setEndereco(new Endereco());

            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setSexo(rs.getString("sexo"));
            usuario.setDataNascimento(rs.getDate("dataNascimento"));
            usuario.setCpf(rs.getString("cpf"));
            usuario.setRg(rs.getString("rg"));
            usuario.setEmail(rs.getString("email"));
            usuario.setPerfil(rs.getInt("perfil"));
            usuario.setSituacao(rs.getInt("situacao"));
            usuario.getEndereco().setIdEndereco(rs.getInt("id_Endereco"));
            usuario.getEndereco().setLogradouro(rs.getString("logradouro"));
            usuario.getEndereco().setNumero(rs.getString("numero"));
            usuario.getEndereco().setComplemento(rs.getString("complemento"));
            usuario.getEndereco().setCep(rs.getString("cep"));
            usuario.getEndereco().setBairro(rs.getString("bairro"));
            usuario.getEndereco().setCidade(rs.getString("cidade"));
            usuario.getEndereco().setEstado(rs.getString("estado"));
            list.add(usuario);
        }
        fecharConexao();
        return list;
    }
}
